Son técnicas que permiten encontrar subgrupos (clusters) en un conjunto de datos.
Buscamos crear particiones que contengan elementos similares entre ellos pero distintos respecto a elementos de otra partición.
Se trata de un problema no supervisado que tiene como objetivo encontrar la “estructura” de los datos.
\(C_1, C_2,...,C_k\) es una partición de \(C\) de tamaño \(k\) si \(\cup_i \ C_i = C\) y \(C_i \cap C_j=\varnothing\) si \(i\neq j\)
Una medida de disimiliaridad en un conjunto finito \(X\), es una función \(d:X\times X \rightarrow \mathbb{R}\), simétrica.
Un clúster es un subconjunto \(C_i\) donde \(C_1, C_2,...,C_k\) es una partición de \(C\)
Dan una descripción de los datos en términos de una fuerte similitud interna por lo que los clústers usualmente se definen en términos de cohesión interna e isolación externa.
Diferentes clusterizaciones pueden ser comparadas respecto a:
Densidad
Varianza
Forma
Separación
Particion inicial de los datos
Para cada clúster se asigna un “centro”
Se recalculan los miembros de cada clúster usando los “centros”
Se actualizan los centros con la nueva asignación de miembros
Se repiten los pasos 2 a 4 hasta que no haya asignaciones nuevas o no haya cambios en la calidad de los clústers.
graficas <- list()
for( i in 1:12){
k <- kmeans(b,
centers = i, # tomar una particion aleatoria de tamaño i
iter.max = 50, # max num de iteraciones
nstart = 1, # if centers is a number, how many random sets should be chosen?
algorithm = "Hartigan-Wong", #c("Hartigan-Wong", "Lloyd", "Forgy", MacQueen")
trace = FALSE)
b$cluster <- k$cluster # asignamos el cluster
graficas[[i]] <- ggplot(b, aes(x=x, y=y)) +
geom_point(aes(colour= as.factor(cluster))) +
ggtitle(paste("clusters = ",i,"\n Variación Interna = ", round(k$tot.withinss,1)))+
theme_minimal()
}Usando esta imagen aplique el algoritmo k-medias para comprimirla a través de una reducción del número de colores usados.
La idea es clusterizar el espacio de colores y reemplazar cada pixel con el centro del clúster al que pertenece.
require(jpeg)
require(ggplot2)
img <- readJPEG("RMarkdown/Clustering/ColorfulBird.jpg")
dim(img)
img_df <- data.frame(
x = rep(1:dim(img)[2], each = dim(img)[1]),
y = rep(dim(img)[1]:1, dim(img)[2]),
R = as.vector(img[,,1]),
G = as.vector(img[,,2]),
B = as.vector(img[,,3])
)
ggplot(data = img_df, aes(x = x, y = y)) +
geom_point(colour = rgb(img_df[c("R", "G", "B")])) +
labs(title = "Original Image:") +
theme_minimal()| Clustering en el espacio RGB | Clustering en el espacio \(PCA^2\) |
|---|---|
| Imagen en el espacio de colores original | Imagen en un espacio de 3 colores |
|---|---|
| Clustering en el espacio RGB | Clustering en el espacio \(PCA^2\) |
|---|---|
| Imagen en el espacio de colores original | Imagen en un espacio de 4 colores |
|---|---|
| Clustering en el espacio RGB | Clustering en el espacio \(PCA^2\) |
|---|---|
| Imagen en el espacio de colores original | Imagen en un espacio de 5 colores |
|---|---|
| Clustering en el espacio RGB | Clustering en el espacio \(PCA^2\) |
|---|---|
| Imagen en el espacio de colores original | Imagen en un espacio de 10 colores |
|---|---|
| Métrica | n = 3 | n = 4 | n = 5 | n = 10 |
|---|---|---|---|---|
| Total sum of squares | 108,971 | 108,971 | 108,971 | 108,971 |
| Total within sum of squares | 39,999.45 | 30,435.43 | 27,286.2 | 12,324.78 |
| Between sum of square | 68,971.52 | 78,535.54 | 81,684.77 | 96,646.19 |
| Between / Total | 0.63 | 0.72 | 0.75 | 0.89 |